import fs from "fs";
import { skipComments } from "./skipComments";

const g = [`'`, "`", `"`]; //js的三种字符串符号

//在国际化字符串中找出所有key,value
/**
 * @str 国际化字符串
 * @ignore 忽略的国际化
 */
const getList = (
  str: string,
  ignore?: string[]
): [string[], string[], string] => {
  const tokens: string[] = []; //key
  const keyTokens: string[] = []; //value
  let flag = true;
  function fun() {
    let keyStr = str.slice(0, str.indexOf(":")).trim();
    str = str.slice(str.indexOf(":") + 1).trim();
    /*查看value下一个字符是不是字符串符号'"`如果不是就说明检索出了问题,
      直接停止检索并把检索失败的字符串当错误信息抛出去
    */
    if (!g.includes(str[0])) flag = false;
    if (!g.includes(keyStr[keyStr.length - 1])) {
      // 在key没有被字符串`'"符号包裹的时候从前往后最近的一个空白字符就算没有空白符也必定有,
      keyStr = keyStr.slice(keyStr.search(/[^,^\s]/));
    } else {
      //获取key的字符串符号'"`
      const keySy = keyStr[keyStr.length - 1];
      //筛选出字key的整体
      keyStr = keyStr.slice(
        keyStr.lastIndexOf(keySy, keyStr.length - 2) + 1,
        keyStr.length - 1
      );
    }
    //如果当前key没有被翻译就添加到待翻译队列
    if (!ignore?.includes(keyStr)) {
      //获取value的字符串符号
      const sy = str[0];
      const token = str.slice(1, str.indexOf(sy, 1));

      //保持key,和value的长度
      tokens.push(token);
      keyTokens.push(keyStr);

      str = str.slice(token.length + 2);
    }
    if (str.includes(":") && flag) fun();
  }
  fun();
  if (!flag) return [[""], [""], str.slice(0, 50)];
  return [keyTokens, tokens, ""];
};
interface Param {
  importPath?: string;
  ignore?: string[];
  content?: string;
}
/**
 * @param importPath 读取文件路径
 * @param ignore 忽略的key数组
 */
export const getFileKeyValue = (param: Param) => {
  const { content, importPath, ignore } = param;
  const oldContent = content || fs.readFileSync(importPath as string, "utf-8");
  //获取国际化对象里面的key,value
  let text = oldContent.slice(
    oldContent.indexOf("{") + 1,
    oldContent.lastIndexOf("}")
  );

  //过滤掉注释
  text = skipComments(text) || "";
  //获取所有value
  return getList(text, ignore);
};
